def merge(A:list, B:list):
C = [0]*(len(A) + len(B))
i = k = n = 0
while i < len(A) and k < len(B):
if A[i] <= B[k]: # <= better then <
C[n] = A[i]; i += 1; n += 1
else:
C[n] = B[k]; k += 1; n += 1
while i < len(A):
C[n] = A[i]; i += 1; n += 1
while k < len(B):
C[n] = B[k]; k += 1; n += 1
return C
def merge_sort(A):
''' Merge sort N*Log2(N) [recursion] '''
if len(A) <= 1:
return
middle = len(A) // 2
L = [A[i] for i in range (0, middle)]
R = [A[i] for i in range (middle, len(A))]
merge_sort(L)
merge_sort(R)
C = merge(L, R)
# copy from merged to original array
for i in range(len(A)):
A[i] = C[i]
# test
def test_sort(sort_algorithm):
print("Testing: ", sort_algorithm.__doc__)
print("testcase #1: ", end="")
A = [7, 3, 12, 8, 9, 1, 6]
A_sorted = [1, 3, 6, 7, 8, 9, 12]
sort_algorithm(A)
print("Ok" if A == A_sorted else "Fail")
if __name__ == "__main__":
test_sort(merge_sort)